Skip to content

feat: add trend visualization with sparklines to perf report#9939

Merged
christian-byrne merged 3 commits intomainfrom
feat/perf-trend-visualization
Mar 17, 2026
Merged

feat: add trend visualization with sparklines to perf report#9939
christian-byrne merged 3 commits intomainfrom
feat/perf-trend-visualization

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Mar 15, 2026

Summary

Add historical trend visualization (ASCII sparklines + directional arrows) to the performance PR report, showing how each metric has moved over recent commits on main.

Changes

  • What: New sparkline(), trendDirection(), trendArrow() functions in perf-stats.ts. New collapsible "Trend" section in the perf report showing per-metric sparklines, direction indicators, and latest values. CI workflow updated to download historical data from the perf-data orphan branch and switched to setup-frontend action with pnpm exec tsx.

Review Focus

  • The trend section only renders when ≥3 historical data points exist (gracefully absent otherwise)
  • trendDirection() uses a split-half mean comparison with ±10% threshold — review whether this sensitivity is appropriate
  • The git archive step in pr-perf-report.yaml is idempotent and fails silently if no perf-history data exists yet on the perf-data branch

┆Issue is synchronized with this Notion page by Unito

@christian-byrne christian-byrne requested a review from a team as a code owner March 15, 2026 04:05
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Mar 15, 2026
@github-actions
Copy link

github-actions bot commented Mar 15, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/17/2026, 01:17:51 PM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 15, 2026

🎭 Playwright: ❌ 622 passed, 1 failed · 5 flaky

❌ Failed Tests

📊 Browser Reports
  • chromium: View Report (✅ 609 / ❌ 1 / ⚠️ 5 / ⏭️ 10)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 10 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 15, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds sparkline/trend utilities and integrates trend visuals into perf reports; removes two legacy PR workflow files and introduces a unified PR report workflow plus CI tweaks that record head SHAs and fetch historical perf baselines; adds a unified-report generator combining size and perf outputs.

Changes

Cohort / File(s) Summary
Workflows — new / removed / modified
\.github/workflows/pr-report.yaml, \.github/workflows/ci-perf-report.yaml, \.github/workflows/ci-size-data.yaml, \.github/workflows/pr-perf-report.yaml (removed), \.github/workflows/pr-size-report.yaml (removed)
Removed two legacy PR-specific workflows; added pr-report.yaml (unified report) that fetches size/perf artifacts, optional historical perf from perf-data, and posts a comment. Minor CI workflow tweaks: record PR head SHA to temp files and concurrency for size workflow.
Perf stats utilities & tests
scripts/perf-stats.ts, scripts/perf-stats.test.ts
Added exports: TrendDirection type, sparkline(values), trendDirection(values), and trendArrow(dir) plus tests validating sparkline output, trend direction heuristics, and arrow mapping.
Perf report script
scripts/perf-report.ts
Integrated historical loading robustness and new trend rendering: computes time-series per test/metric, determines direction/arrow, generates sparklines, and appends Trend sections when ≥3 historical points exist.
Unified report generator
scripts/unified-report.js
New script that composes Bundle Size and Performance sections by invoking size and perf report tools conditionally based on status flags; outputs combined pr-report.md content.
Perf workflow removal specifics
\.github/workflows/pr-perf-report.yaml (removed)
Previously handled detailed PR perf-report lifecycle (checkout, Node setup, fetch perf-history, generate report, post comment); fully removed.
Size workflow removal specifics
\.github/workflows/pr-size-report.yaml (removed)
Previously implemented PR size-report lifecycle (artifact validation, baseline download, generate/post); fully removed.

Sequence Diagram

sequenceDiagram
    participant GHA as GitHub Actions
    participant Repo as Repo (artifacts)
    participant PerfData as perf-data branch
    participant Unified as scripts/unified-report.js
    participant PerfReport as scripts/perf-report.ts
    participant PerfStats as scripts/perf-stats.ts
    participant Output as PR Comment

    GHA->>Repo: locate size & perf workflow run artifacts (by head SHA)
    GHA->>PerfData: attempt fetch/download historical perf archive (optional)
    GHA->>Unified: run unified-report with size/perf statuses
    activate Unified
    Unified->>PerfReport: invoke perf-report (when perf ready)
    activate PerfReport
    PerfReport->>PerfData: read historical metric files (if present)
    PerfReport->>PerfStats: compute sparkline(timeSeries)
    PerfReport->>PerfStats: compute trendDirection(timeSeries)
    PerfReport->>PerfStats: compute trendArrow(direction)
    PerfReport-->>Unified: rendered perf section (with trends if ≥3 points)
    deactivate PerfReport
    Unified->>Output: post combined report as PR comment
    deactivate Unified
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐇 I hop through timestamps, nibble on each line,

Sparks of history curl, arrows point the climb,
I fetch the past branches, stitch trends into view,
A tiny report blossom — numbers in a queue. ✨

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 10.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding trend visualization with sparklines to the performance report.
Description check ✅ Passed The description follows the template structure with Summary, Changes, and Review Focus sections. All required information is present and addresses the key aspects of the PR.
End-To-End Regression Coverage For Fixes ✅ Passed PR is a feature addition (feat: prefix) with no bug-fix language, therefore regression test changes are not required.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/perf-trend-visualization
📝 Coding Plan
  • Generate coding plan for human review comments

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
scripts/perf-stats.ts (1)

86-104: Consider the zero-baseline edge case.

When firstMean === 0 but secondMean > 0, the function returns 'stable' to avoid division by zero. This is a safe fallback, but it masks what could be a significant upward trend (e.g., a metric that was previously zero and is now non-zero).

If this scenario is unlikely for the performance metrics being tracked, the current behavior is acceptable. Otherwise, consider treating it as 'rising' when secondMean > 0 and firstMean === 0.

Optional: Handle zero-baseline as rising
-  if (firstMean === 0) return 'stable'
+  if (firstMean === 0) return secondMean > 0 ? 'rising' : 'stable'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/perf-stats.ts` around lines 86 - 104, The current trendDirection
function returns 'stable' when firstMean === 0 to avoid division by zero, which
hides cases where secondMean > 0; update trendDirection to explicitly handle the
zero-baseline: if firstMean === 0 and secondMean > 0 return 'rising' (and if
both are 0 keep 'stable'), otherwise compute changePct as before using
((secondMean - firstMean) / firstMean) * 100 to determine
'rising'/'falling'/'stable' while avoiding division by zero; refer to the
function trendDirection and the variables firstMean, secondMean, and changePct
when making the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@scripts/perf-stats.ts`:
- Around line 86-104: The current trendDirection function returns 'stable' when
firstMean === 0 to avoid division by zero, which hides cases where secondMean >
0; update trendDirection to explicitly handle the zero-baseline: if firstMean
=== 0 and secondMean > 0 return 'rising' (and if both are 0 keep 'stable'),
otherwise compute changePct as before using ((secondMean - firstMean) /
firstMean) * 100 to determine 'rising'/'falling'/'stable' while avoiding
division by zero; refer to the function trendDirection and the variables
firstMean, secondMean, and changePct when making the change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: daf48065-805c-4f22-b1c5-8ad9d68733b1

📥 Commits

Reviewing files that changed from the base of the PR and between 4068979 and b2d31dc.

📒 Files selected for processing (4)
  • .github/workflows/pr-perf-report.yaml
  • scripts/perf-report.ts
  • scripts/perf-stats.test.ts
  • scripts/perf-stats.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • scripts/perf-stats.test.ts

Copy link
Member

@benceruleanlu benceruleanlu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

feel free to (force) merge and iterate, but it will need to change with #9911, and PTAL:

the new history download path is incompatible with the current perf-data branch contents. I verified origin/perf-data currently contains baselines/perf-*.json, while this change archives perf-history/ and the loader only reads temp/perf-history/

/perf-metrics.json.

christian-byrne added a commit that referenced this pull request Mar 17, 2026
- Add history download step to unified pr-report.yaml reading from
  baselines/ on perf-data branch (the actual layout)
- Fix loadHistoricalReports to handle flat JSON files, not just
  subdirectories with perf-metrics.json
- Handle zero-baseline edge case in trendDirection: return 'rising'
  when firstMean=0 but secondMean>0 instead of masking as 'stable'

Addresses review feedback:
#9939 (review)
@christian-byrne christian-byrne force-pushed the feat/perf-trend-visualization branch from a712634 to 0f3ea48 Compare March 17, 2026 08:32
@dosubot dosubot bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Mar 17, 2026
@christian-byrne christian-byrne changed the base branch from main to feat/unified-pr-perf-report March 17, 2026 08:32
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Mar 17, 2026
@socket-security
Copy link

socket-security bot commented Mar 17, 2026

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addedvite@​8.0.0941008299100

View full report

@socket-security
Copy link

socket-security bot commented Mar 17, 2026

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
Obfuscated code: npm vite is 91.0% likely obfuscated

Confidence: 0.91

Location: Package overview

From: apps/desktop-ui/package.jsonnpm/vite@8.0.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/vite@8.0.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

@christian-byrne
Copy link
Contributor Author

fixed in 0f3ea48 - stacked this PR on #9911 (which replaces pr-perf-report.yaml with pr-report.yaml), added a history download step that reads from baselines/ using git ls-tree + git show, and updated loadHistoricalReports() to handle flat .json files. also fixed the zero-baseline edge case coderabbit flagged.

ready for re-review @benceruleanlu

Base automatically changed from feat/unified-pr-perf-report to main March 17, 2026 10:03
@dosubot dosubot bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Mar 17, 2026
christian-byrne and others added 3 commits March 17, 2026 06:14
- Add sparkline(), trendDirection(), trendArrow() to perf-stats.ts
- Add collapsible 'Trend' section to perf-report.ts showing ASCII
  sparklines and directional arrows for each metric over last N
  commits on main
- Add historical data download step to pr-perf-report.yaml from
  perf-data orphan branch
- Switch pr-perf-report.yaml to setup-frontend action and pnpm exec
- Add tests for all new functions (sparkline, trendDirection, trendArrow)
- Add history download step to unified pr-report.yaml reading from
  baselines/ on perf-data branch (the actual layout)
- Fix loadHistoricalReports to handle flat JSON files, not just
  subdirectories with perf-metrics.json
- Handle zero-baseline edge case in trendDirection: return 'rising'
  when firstMean=0 but secondMean>0 instead of masking as 'stable'

Addresses review feedback:
#9939 (review)
@christian-byrne christian-byrne force-pushed the feat/perf-trend-visualization branch from 0f3ea48 to 5b9e71e Compare March 17, 2026 13:14
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Mar 17, 2026
@github-actions
Copy link

github-actions bot commented Mar 17, 2026

📦 Bundle: 5 MB gzip 🔴 +126 B

Details

Summary

  • Raw size: 23.1 MB baseline 23.1 MB — ⚪ 0 B
  • Gzip: 5 MB baseline 5 MB — 🔴 +126 B
  • Brotli: 3.87 MB baseline 3.87 MB — 🟢 -334 B
  • Bundles: 244 current • 244 baseline • 114 added / 114 removed

Category Glance
Vendor & Third-Party ⚪ 0 B (9.78 MB) · Other ⚪ 0 B (8.24 MB) · Data & Services ⚪ 0 B (2.91 MB) · Graph Workspace ⚪ 0 B (1.1 MB) · Panels & Settings ⚪ 0 B (461 kB) · Utilities & Hooks ⚪ 0 B (318 kB) · + 5 more

App Entry Points — 22.7 kB (baseline 22.7 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-6uPGtxog.js (new) 22.7 kB 🔴 +22.7 kB 🔴 +8.03 kB 🔴 +6.87 kB
assets/index-BrvS4RCW.js (removed) 22.7 kB 🟢 -22.7 kB 🟢 -8.03 kB 🟢 -6.89 kB

Status: 1 added / 1 removed

Graph Workspace — 1.1 MB (baseline 1.1 MB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BrXrFz8l.js (removed) 1.1 MB 🟢 -1.1 MB 🟢 -234 kB 🟢 -177 kB
assets/GraphView-DFVWAe3G.js (new) 1.1 MB 🔴 +1.1 MB 🔴 +234 kB 🔴 +177 kB

Status: 1 added / 1 removed

Views & Navigation — 75.9 kB (baseline 75.9 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CDAlLChw.js (removed) 15.6 kB 🟢 -15.6 kB 🟢 -3.38 kB 🟢 -2.88 kB
assets/CloudSurveyView-sWTzY4GE.js (new) 15.6 kB 🔴 +15.6 kB 🔴 +3.38 kB 🔴 +2.88 kB
assets/CloudLoginView-BYUgIpFH.js (removed) 11.9 kB 🟢 -11.9 kB 🟢 -3.31 kB 🟢 -2.93 kB
assets/CloudLoginView-XJfXKQjm.js (new) 11.9 kB 🔴 +11.9 kB 🔴 +3.32 kB 🔴 +2.93 kB
assets/CloudSignupView-BhQeUSsb.js (removed) 9.64 kB 🟢 -9.64 kB 🟢 -2.8 kB 🟢 -2.45 kB
assets/CloudSignupView-D7PTOWEq.js (new) 9.64 kB 🔴 +9.64 kB 🔴 +2.8 kB 🔴 +2.45 kB
assets/UserCheckView-L8-Ygpdh.js (removed) 9.01 kB 🟢 -9.01 kB 🟢 -2.31 kB 🟢 -2.01 kB
assets/UserCheckView-NhrW2U-B.js (new) 9.01 kB 🔴 +9.01 kB 🔴 +2.31 kB 🔴 +2.01 kB
assets/CloudLayoutView-BweZRQRV.js (new) 7.42 kB 🔴 +7.42 kB 🔴 +2.31 kB 🔴 +1.99 kB
assets/CloudLayoutView-Ljbke9I9.js (removed) 7.42 kB 🟢 -7.42 kB 🟢 -2.31 kB 🟢 -2.01 kB
assets/CloudForgotPasswordView-DCOm8hZY.js (removed) 5.85 kB 🟢 -5.85 kB 🟢 -2.04 kB 🟢 -1.79 kB
assets/CloudForgotPasswordView-mayKD8CX.js (new) 5.85 kB 🔴 +5.85 kB 🔴 +2.04 kB 🔴 +1.8 kB
assets/CloudAuthTimeoutView-CiiOgHPc.js (new) 5.21 kB 🔴 +5.21 kB 🔴 +1.88 kB 🔴 +1.65 kB
assets/CloudAuthTimeoutView-DBTLkNC8.js (removed) 5.21 kB 🟢 -5.21 kB 🟢 -1.88 kB 🟢 -1.65 kB
assets/CloudSubscriptionRedirectView-CDk0a2O6.js (removed) 4.98 kB 🟢 -4.98 kB 🟢 -1.86 kB 🟢 -1.64 kB
assets/CloudSubscriptionRedirectView-DdrK1z1d.js (new) 4.98 kB 🔴 +4.98 kB 🔴 +1.86 kB 🔴 +1.64 kB
assets/UserSelectView-DuK0lzcm.js (removed) 4.67 kB 🟢 -4.67 kB 🟢 -1.73 kB 🟢 -1.52 kB
assets/UserSelectView-n5Pyyhzp.js (new) 4.67 kB 🔴 +4.67 kB 🔴 +1.73 kB 🔴 +1.52 kB

Status: 9 added / 9 removed / 2 unchanged

Panels & Settings — 461 kB (baseline 461 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-Cv58WM2W.js (new) 28.9 kB 🔴 +28.9 kB 🔴 +6.19 kB 🔴 +5.5 kB
assets/KeybindingPanel-qv3wotLm.js (removed) 28.9 kB 🟢 -28.9 kB 🟢 -6.19 kB 🟢 -5.5 kB
assets/SecretsPanel-BFM2wAnk.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.41 kB 🔴 +4.75 kB
assets/SecretsPanel-DaMhvOTZ.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.41 kB 🟢 -4.74 kB
assets/LegacyCreditsPanel-BlOUn_ZO.js (removed) 21.4 kB 🟢 -21.4 kB 🟢 -5.71 kB 🟢 -5.04 kB
assets/LegacyCreditsPanel-BvGAdCXu.js (new) 21.4 kB 🔴 +21.4 kB 🔴 +5.72 kB 🔴 +5.04 kB
assets/SubscriptionPanel-C-lXcnHh.js (removed) 19.3 kB 🟢 -19.3 kB 🟢 -4.89 kB 🟢 -4.31 kB
assets/SubscriptionPanel-zu7VnFNX.js (new) 19.3 kB 🔴 +19.3 kB 🔴 +4.9 kB 🔴 +4.3 kB
assets/AboutPanel-Cl3a0e5V.js (removed) 12 kB 🟢 -12 kB 🟢 -3.31 kB 🟢 -2.96 kB
assets/AboutPanel-DeMQfUmz.js (new) 12 kB 🔴 +12 kB 🔴 +3.31 kB 🔴 +2.97 kB
assets/ExtensionPanel-C17w2IE_.js (new) 9.66 kB 🔴 +9.66 kB 🔴 +2.77 kB 🔴 +2.45 kB
assets/ExtensionPanel-Xrn_semG.js (removed) 9.66 kB 🟢 -9.66 kB 🟢 -2.77 kB 🟢 -2.45 kB
assets/ServerConfigPanel-BRLGKLXi.js (new) 6.74 kB 🔴 +6.74 kB 🔴 +2.24 kB 🔴 +1.99 kB
assets/ServerConfigPanel-BVObnp1i.js (removed) 6.74 kB 🟢 -6.74 kB 🟢 -2.23 kB 🟢 -2.01 kB
assets/UserPanel-B2V2uII7.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.1 kB 🟢 -1.84 kB
assets/UserPanel-BmcsFl_4.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.1 kB 🔴 +1.86 kB
assets/cloudRemoteConfig-CXElOkYO.js (removed) 1.74 kB 🟢 -1.74 kB 🟢 -855 B 🟢 -753 B
assets/cloudRemoteConfig-DyH3nG75.js (new) 1.74 kB 🔴 +1.74 kB 🔴 +851 B 🔴 +736 B
assets/refreshRemoteConfig-Bk9IHz4X.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -647 B 🟢 -554 B
assets/refreshRemoteConfig-DMoLkcWt.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +648 B 🔴 +550 B

Status: 10 added / 10 removed / 12 unchanged

User & Accounts — 16.9 kB (baseline 16.9 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-CmfI7hPI.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.26 kB 🔴 +1.08 kB
assets/auth-DxawL5T5.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/SignUpForm-B6hLRLXM.js (new) 3.18 kB 🔴 +3.18 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/SignUpForm-BJ-Rx2oH.js (removed) 3.18 kB 🟢 -3.18 kB 🟢 -1.29 kB 🟢 -1.15 kB
assets/UpdatePasswordContent-C_cID4fE.js (removed) 2.56 kB 🟢 -2.56 kB 🟢 -1.14 kB 🟢 -1.01 kB
assets/UpdatePasswordContent-K05C5-Pt.js (new) 2.56 kB 🔴 +2.56 kB 🔴 +1.14 kB 🔴 +1.01 kB
assets/firebaseAuthStore-DEVLLJx2.js (new) 907 B 🔴 +907 B 🔴 +437 B 🔴 +390 B
assets/firebaseAuthStore-Dpm9xGDg.js (removed) 907 B 🟢 -907 B 🟢 -439 B 🟢 -388 B
assets/auth-CliChHCa.js (removed) 313 B 🟢 -313 B 🟢 -199 B 🟢 -178 B
assets/auth-DsJGZ_dn.js (new) 313 B 🔴 +313 B 🔴 +200 B 🔴 +184 B

Status: 5 added / 5 removed / 2 unchanged

Editors & Dialogs — 82 kB (baseline 82 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-oDIdcPyI.js (new) 81.2 kB 🔴 +81.2 kB 🔴 +16.9 kB 🔴 +14.5 kB
assets/useShareDialog-XTeejd4r.js (removed) 81.2 kB 🟢 -81.2 kB 🟢 -16.9 kB 🟢 -14.5 kB
assets/useSubscriptionDialog-D3PZAPzQ.js (new) 855 B 🔴 +855 B 🔴 +427 B 🔴 +367 B
assets/useSubscriptionDialog-n0AhKGuk.js (removed) 855 B 🟢 -855 B 🟢 -428 B 🟢 -369 B

Status: 2 added / 2 removed

UI Components — 59.3 kB (baseline 59.3 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-DslP5XVG.js (new) 14.3 kB 🔴 +14.3 kB 🔴 +4 kB 🔴 +3.58 kB
assets/ComfyQueueButton-DU3UYtf0.js (removed) 14.3 kB 🟢 -14.3 kB 🟢 -4 kB 🟢 -3.58 kB
assets/useTerminalTabs-C2HorWb2.js (new) 10.6 kB 🔴 +10.6 kB 🔴 +3.55 kB 🔴 +3.12 kB
assets/useTerminalTabs-DAQx4AEK.js (removed) 10.6 kB 🟢 -10.6 kB 🟢 -3.55 kB 🟢 -3.13 kB
assets/SubscribeButton-D6oACUrA.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -912 B
assets/SubscribeButton-ZmZ2lyXb.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +916 B
assets/cloudFeedbackTopbarButton-DsP4IcOJ.js (removed) 1.55 kB 🟢 -1.55 kB 🟢 -795 B 🟢 -709 B
assets/cloudFeedbackTopbarButton-o3P3pMSE.js (new) 1.55 kB 🔴 +1.55 kB 🔴 +793 B 🔴 +706 B
assets/ComfyQueueButton-BrZetX2g.js (removed) 912 B 🟢 -912 B 🟢 -441 B 🟢 -391 B
assets/ComfyQueueButton-CfpCUFnr.js (new) 912 B 🔴 +912 B 🔴 +440 B 🔴 +388 B

Status: 5 added / 5 removed / 8 unchanged

Data & Services — 2.91 MB (baseline 2.91 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-BLqPiKky.js (new) 1.91 MB 🔴 +1.91 MB 🔴 +439 kB 🔴 +333 kB
assets/dialogService-ZpuPIK69.js (removed) 1.91 MB 🟢 -1.91 MB 🟢 -439 kB 🟢 -333 kB
assets/api-C4AvIGxt.js (new) 862 kB 🔴 +862 kB 🔴 +206 kB 🔴 +162 kB
assets/api-CtdfRawW.js (removed) 862 kB 🟢 -862 kB 🟢 -206 kB 🟢 -162 kB
assets/load3dService-0QdPJhzI.js (removed) 92.3 kB 🟢 -92.3 kB 🟢 -19.6 kB 🟢 -16.9 kB
assets/load3dService-BjJwgnLb.js (new) 92.3 kB 🔴 +92.3 kB 🔴 +19.6 kB 🔴 +16.9 kB
assets/workflowShareService-CiCqbu5y.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +4.32 kB 🔴 +3.8 kB
assets/workflowShareService-DiA--_7r.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -4.32 kB 🟢 -3.8 kB
assets/releaseStore-B_thg5I2.js (new) 8.12 kB 🔴 +8.12 kB 🔴 +2.27 kB 🔴 +1.99 kB
assets/releaseStore-DJRdjRnW.js (removed) 8.12 kB 🟢 -8.12 kB 🟢 -2.26 kB 🟢 -1.99 kB
assets/keybindingService-DBqPkIo4.js (removed) 7.03 kB 🟢 -7.03 kB 🟢 -1.75 kB 🟢 -1.5 kB
assets/keybindingService-RROAIw9x.js (new) 7.03 kB 🔴 +7.03 kB 🔴 +1.75 kB 🔴 +1.51 kB
assets/systemStatsStore-BakURDmG.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.67 kB 🟢 -1.44 kB
assets/systemStatsStore-BXrK9Gal.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.67 kB 🔴 +1.45 kB
assets/userStore-52LIM1A7.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -871 B 🟢 -761 B
assets/userStore-Bh7db8Te.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +869 B 🔴 +768 B
assets/audioService-Dr6QO0Cj.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +866 B 🔴 +741 B
assets/audioService-Dygamnnr.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -861 B 🟢 -748 B
assets/releaseStore-BtVt082G.js (removed) 879 B 🟢 -879 B 🟢 -432 B 🟢 -377 B
assets/releaseStore-CMa-FpNe.js (new) 879 B 🔴 +879 B 🔴 +433 B 🔴 +374 B
assets/workflowDraftStore-BbH9Ts-S.js (removed) 855 B 🟢 -855 B 🟢 -428 B 🟢 -375 B
assets/workflowDraftStore-BLW_9UA9.js (new) 855 B 🔴 +855 B 🔴 +427 B 🔴 +376 B
assets/dialogService-BZUkftTG2.js (removed) 844 B 🟢 -844 B 🟢 -419 B 🟢 -368 B
assets/dialogService-C1BT24Xf2.js (new) 844 B 🔴 +844 B 🔴 +418 B 🔴 +369 B
assets/settingStore-Cv_d7pn3.js (removed) 842 B 🟢 -842 B 🟢 -422 B 🟢 -368 B
assets/settingStore-D8BDBqrZ.js (new) 842 B 🔴 +842 B 🔴 +422 B 🔴 +366 B
assets/assetsStore-DNtQ-8Wo.js (removed) 841 B 🟢 -841 B 🟢 -422 B 🟢 -371 B
assets/assetsStore-gfSvycqA.js (new) 841 B 🔴 +841 B 🔴 +422 B 🔴 +367 B

Status: 14 added / 14 removed / 3 unchanged

Utilities & Hooks — 318 kB (baseline 318 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-D83hEdlI.js (new) 231 kB 🔴 +231 kB 🔴 +51.2 kB 🔴 +41.7 kB
assets/useConflictDetection-DvAcd-_T.js (removed) 231 kB 🟢 -231 kB 🟢 -51.2 kB 🟢 -41.8 kB
assets/useLoad3dViewer-ByULgF7e.js (new) 15.1 kB 🔴 +15.1 kB 🔴 +3.42 kB 🔴 +3.03 kB
assets/useLoad3dViewer-Cm7ZoCx-.js (removed) 15.1 kB 🟢 -15.1 kB 🟢 -3.42 kB 🟢 -3.02 kB
assets/useLoad3d-l2n0rm6S.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -3.78 kB 🟢 -3.37 kB
assets/useLoad3d-n5LL4U01.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +3.78 kB 🔴 +3.36 kB
assets/useFeatureFlags-DDH7kYib.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.75 kB 🔴 +1.48 kB
assets/useFeatureFlags-sJle_Lf4.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.75 kB 🟢 -1.48 kB
assets/useWorkspaceUI-rQUsVWi2.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -980 B 🟢 -809 B
assets/useWorkspaceUI-xmn2Xiam.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +979 B 🔴 +810 B
assets/subscriptionCheckoutUtil-DFKydJpb.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.32 kB 🔴 +1.14 kB
assets/subscriptionCheckoutUtil-V516cltX.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.32 kB 🟢 -1.15 kB
assets/useUpstreamValue-CyDRi87p.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +804 B 🔴 +718 B
assets/useUpstreamValue-DXZO451g.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -805 B 🟢 -711 B
assets/assetPreviewUtil-BfI_zibp.js (new) 1.74 kB 🔴 +1.74 kB 🔴 +759 B 🔴 +663 B
assets/assetPreviewUtil-Dw6ik_5g.js (removed) 1.74 kB 🟢 -1.74 kB 🟢 -759 B 🟢 -663 B
assets/useErrorHandling-DRXOUbNQ.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +651 B 🔴 +550 B
assets/useErrorHandling-iiVdZRvh.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -648 B 🟢 -550 B
assets/useLoad3d-5DCEhW4V.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -491 B 🟢 -439 B
assets/useLoad3d-CnB-b2Vu.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +489 B 🔴 +437 B
assets/audioUtils-5KRPk7S1.js (removed) 958 B 🟢 -958 B 🟢 -565 B 🟢 -494 B
assets/audioUtils-DRuEI5oe.js (new) 958 B 🔴 +958 B 🔴 +564 B 🔴 +460 B
assets/useLoad3dViewer-C-w8paSR.js (removed) 957 B 🟢 -957 B 🟢 -457 B 🟢 -408 B
assets/useLoad3dViewer-Ci3_8RPq.js (new) 957 B 🔴 +957 B 🔴 +457 B 🔴 +408 B
assets/useCurrentUser-BPJOhs0t.js (new) 841 B 🔴 +841 B 🔴 +422 B 🔴 +368 B
assets/useCurrentUser-cb6rD3GY.js (removed) 841 B 🟢 -841 B 🟢 -422 B 🟢 -371 B
assets/useWorkspaceSwitch-BbG1HWJ1.js (new) 747 B 🔴 +747 B 🔴 +386 B 🔴 +332 B
assets/useWorkspaceSwitch-CteYtwBw.js (removed) 747 B 🟢 -747 B 🟢 -385 B 🟢 -327 B

Status: 14 added / 14 removed / 8 unchanged

Vendor & Third-Party — 9.78 MB (baseline 9.78 MB) • ⚪ 0 B

External libraries and shared vendor chunks

Status: 16 unchanged

Other — 8.24 MB (baseline 8.24 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-C4RX7pbK.js (new) 76.1 kB 🔴 +76.1 kB 🔴 +19.6 kB 🔴 +16.7 kB
assets/core-fO1O3CFJ.js (removed) 76.1 kB 🟢 -76.1 kB 🟢 -19.6 kB 🟢 -16.7 kB
assets/groupNode-D5_HsDwx.js (new) 73.9 kB 🔴 +73.9 kB 🔴 +18.5 kB 🔴 +16.3 kB
assets/groupNode-FNNk5F4j.js (removed) 73.9 kB 🟢 -73.9 kB 🟢 -18.5 kB 🟢 -16.3 kB
assets/WidgetSelect-BIONVaht.js (new) 63.3 kB 🔴 +63.3 kB 🔴 +13.8 kB 🔴 +11.9 kB
assets/WidgetSelect-DFuZ15NE.js (removed) 63.3 kB 🟢 -63.3 kB 🟢 -13.8 kB 🟢 -11.9 kB
assets/SubscriptionRequiredDialogContentWorkspace--PHvRL28.js (removed) 47.2 kB 🟢 -47.2 kB 🟢 -8.8 kB 🟢 -7.61 kB
assets/SubscriptionRequiredDialogContentWorkspace-CzluATmi.js (new) 47.2 kB 🔴 +47.2 kB 🔴 +8.8 kB 🔴 +7.62 kB
assets/WidgetPainter-BSi6oHpd.js (new) 33.2 kB 🔴 +33.2 kB 🔴 +8.06 kB 🔴 +7.15 kB
assets/WidgetPainter-DXI1Y_xO.js (removed) 33.2 kB 🟢 -33.2 kB 🟢 -8.06 kB 🟢 -7.13 kB
assets/Load3DControls-Cx5aNdor.js (removed) 32.1 kB 🟢 -32.1 kB 🟢 -5.47 kB 🟢 -4.75 kB
assets/Load3DControls-UZFB-VG1.js (new) 32.1 kB 🔴 +32.1 kB 🔴 +5.47 kB 🔴 +4.75 kB
assets/WorkspacePanelContent-C-dQ32fg.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +6.27 kB 🔴 +5.51 kB
assets/WorkspacePanelContent-DmBfZkkz.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -6.28 kB 🟢 -5.52 kB
assets/SubscriptionRequiredDialogContent-B5e6Jl-4.js (new) 26.2 kB 🔴 +26.2 kB 🔴 +6.68 kB 🔴 +5.91 kB
assets/SubscriptionRequiredDialogContent-Ds2mRBdi.js (removed) 26.2 kB 🟢 -26.2 kB 🟢 -6.67 kB 🟢 -5.89 kB
assets/Load3dViewerContent-BEfrbWvX.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -5.32 kB 🟢 -4.63 kB
assets/Load3dViewerContent-BlcdN5gU.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +5.32 kB 🔴 +4.63 kB
assets/WidgetImageCrop-BORDtUZ9.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.8 kB 🟢 -5.09 kB
assets/WidgetImageCrop-DEwWHIl8.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +5.8 kB 🔴 +5.12 kB
assets/SubscriptionPanelContentWorkspace-2dLn_X98.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.17 kB 🟢 -4.55 kB
assets/SubscriptionPanelContentWorkspace-CUR_fl5W.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.17 kB 🔴 +4.55 kB
assets/CurrentUserPopoverWorkspace-C6ZW3cab.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +5.04 kB 🔴 +4.5 kB
assets/CurrentUserPopoverWorkspace-CqDrDe8z.js (removed) 20.9 kB 🟢 -20.9 kB 🟢 -5.04 kB 🟢 -4.49 kB
assets/SignInContent-BzeTQVTC.js (removed) 20.2 kB 🟢 -20.2 kB 🟢 -5.21 kB 🟢 -4.54 kB
assets/SignInContent-CDMwNObP.js (new) 20.2 kB 🔴 +20.2 kB 🔴 +5.21 kB 🔴 +4.54 kB
assets/WidgetInputNumber-CPjslwMn.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.3 kB
assets/WidgetInputNumber-DDEgmguG.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.29 kB
assets/WidgetRecordAudio-DaEYzBo9.js (new) 18.1 kB 🔴 +18.1 kB 🔴 +5.15 kB 🔴 +4.61 kB
assets/WidgetRecordAudio-DTaxb6Mu.js (removed) 18.1 kB 🟢 -18.1 kB 🟢 -5.15 kB 🟢 -4.61 kB
assets/Load3D-BcueVWOS.js (removed) 16.9 kB 🟢 -16.9 kB 🟢 -4.12 kB 🟢 -3.6 kB
assets/Load3D-DF1ScAt6.js (new) 16.9 kB 🔴 +16.9 kB 🔴 +4.13 kB 🔴 +3.6 kB
assets/WidgetCurve-CjrAkIGQ.js (new) 15.1 kB 🔴 +15.1 kB 🔴 +4.67 kB 🔴 +4.2 kB
assets/WidgetCurve-CxvVvKBm.js (removed) 15.1 kB 🟢 -15.1 kB 🟢 -4.67 kB 🟢 -4.2 kB
assets/load3d-D4uDPwWS.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +4.27 kB 🔴 +3.7 kB
assets/load3d-DhNbq6Yi.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -4.27 kB 🟢 -3.7 kB
assets/AudioPreviewPlayer-BGxDjCBR.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.35 kB 🔴 +3 kB
assets/AudioPreviewPlayer-LHShFo1w.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.35 kB 🟢 -3 kB
assets/nodeTemplates-DW2KtvLf.js (new) 9.45 kB 🔴 +9.45 kB 🔴 +3.33 kB 🔴 +2.92 kB
assets/nodeTemplates-WhYMg45H.js (removed) 9.45 kB 🟢 -9.45 kB 🟢 -3.33 kB 🟢 -2.93 kB
assets/InviteMemberDialogContent-C05GoC_E.js (new) 7.66 kB 🔴 +7.66 kB 🔴 +2.4 kB 🔴 +2.1 kB
assets/InviteMemberDialogContent-CAeO_x3C.js (removed) 7.66 kB 🟢 -7.66 kB 🟢 -2.4 kB 🟢 -2.08 kB
assets/Load3DConfiguration-0DAv0Tug.js (removed) 6.55 kB 🟢 -6.55 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/Load3DConfiguration-BhSnix5p.js (new) 6.55 kB 🔴 +6.55 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/onboardingCloudRoutes-Bu1XTQCC.js (new) 6.31 kB 🔴 +6.31 kB 🔴 +1.97 kB 🔴 +1.7 kB
assets/onboardingCloudRoutes-C0Fcy073.js (removed) 6.31 kB 🟢 -6.31 kB 🟢 -1.96 kB 🟢 -1.7 kB
assets/WidgetWithControl-BHY5rxfo.js (removed) 5.87 kB 🟢 -5.87 kB 🟢 -2.31 kB 🟢 -2.06 kB
assets/WidgetWithControl-DXQL93Fj.js (new) 5.87 kB 🔴 +5.87 kB 🔴 +2.31 kB 🔴 +2.06 kB
assets/CreateWorkspaceDialogContent-BMmBiyXe.js (removed) 5.84 kB 🟢 -5.84 kB 🟢 -2.09 kB 🟢 -1.82 kB
assets/CreateWorkspaceDialogContent-wbZs_W7S.js (new) 5.84 kB 🔴 +5.84 kB 🔴 +2.1 kB 🔴 +1.82 kB
assets/FreeTierDialogContent-B5fepRdi.js (removed) 5.7 kB 🟢 -5.7 kB 🟢 -1.99 kB 🟢 -1.77 kB
assets/FreeTierDialogContent-jTJYgTRv.js (new) 5.7 kB 🔴 +5.7 kB 🔴 +2 kB 🔴 +1.76 kB
assets/EditWorkspaceDialogContent-Cj1JxiOa.js (removed) 5.63 kB 🟢 -5.63 kB 🟢 -2.06 kB 🟢 -1.79 kB
assets/EditWorkspaceDialogContent-DgpCtm-4.js (new) 5.63 kB 🔴 +5.63 kB 🔴 +2.06 kB 🔴 +1.79 kB
assets/ValueControlPopover-BFCqCwK4.js (new) 5.22 kB 🔴 +5.22 kB 🔴 +1.88 kB 🔴 +1.68 kB
assets/ValueControlPopover-sSUo8j7w.js (removed) 5.22 kB 🟢 -5.22 kB 🟢 -1.88 kB 🟢 -1.67 kB
assets/Preview3d-CP5G3U81.js (new) 5.2 kB 🔴 +5.2 kB 🔴 +1.72 kB 🔴 +1.5 kB
assets/Preview3d-l_P-D9XH.js (removed) 5.2 kB 🟢 -5.2 kB 🟢 -1.72 kB 🟢 -1.5 kB
assets/WidgetTextarea-_QCHv0Ky.js (removed) 5.15 kB 🟢 -5.15 kB 🟢 -2.02 kB 🟢 -1.78 kB
assets/WidgetTextarea-BOO8advq.js (new) 5.15 kB 🔴 +5.15 kB 🔴 +2.02 kB 🔴 +1.78 kB
assets/CancelSubscriptionDialogContent-D5OtwLPt.js (removed) 5.11 kB 🟢 -5.11 kB 🟢 -1.89 kB 🟢 -1.65 kB
assets/CancelSubscriptionDialogContent-P2JsTgyi.js (new) 5.11 kB 🔴 +5.11 kB 🔴 +1.89 kB 🔴 +1.65 kB
assets/DeleteWorkspaceDialogContent-_lqzzFx6.js (removed) 4.54 kB 🟢 -4.54 kB 🟢 -1.74 kB 🟢 -1.5 kB
assets/DeleteWorkspaceDialogContent-C51kLUBv.js (new) 4.54 kB 🔴 +4.54 kB 🔴 +1.74 kB 🔴 +1.5 kB
assets/tierBenefits-Dm5Wfy59.js (removed) 4.47 kB 🟢 -4.47 kB 🟢 -1.58 kB 🟢 -1.36 kB
assets/tierBenefits-Dnj3-s9y.js (new) 4.47 kB 🔴 +4.47 kB 🔴 +1.58 kB 🔴 +1.36 kB
assets/LeaveWorkspaceDialogContent-B_wUil5O.js (removed) 4.37 kB 🟢 -4.37 kB 🟢 -1.68 kB 🟢 -1.45 kB
assets/LeaveWorkspaceDialogContent-VFL-tiqw.js (new) 4.37 kB 🔴 +4.37 kB 🔴 +1.68 kB 🔴 +1.45 kB
assets/RemoveMemberDialogContent-CiyJdUY1.js (new) 4.35 kB 🔴 +4.35 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/RemoveMemberDialogContent-CS8pXtUx.js (removed) 4.35 kB 🟢 -4.35 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/RevokeInviteDialogContent-CexX41ll.js (removed) 4.26 kB 🟢 -4.26 kB 🟢 -1.65 kB 🟢 -1.44 kB
assets/RevokeInviteDialogContent-Mxk2nzsY.js (new) 4.26 kB 🔴 +4.26 kB 🔴 +1.65 kB 🔴 +1.44 kB
assets/InviteMemberUpsellDialogContent-DGOjLuXu.js (removed) 4.16 kB 🟢 -4.16 kB 🟢 -1.51 kB 🟢 -1.32 kB
assets/InviteMemberUpsellDialogContent-DVkd_PTU.js (new) 4.16 kB 🔴 +4.16 kB 🔴 +1.51 kB 🔴 +1.32 kB
assets/cloudSessionCookie-BdhrqAxX.js (new) 4.02 kB 🔴 +4.02 kB 🔴 +1.44 kB 🔴 +1.24 kB
assets/cloudSessionCookie-D12C3v3Z.js (removed) 4.02 kB 🟢 -4.02 kB 🟢 -1.44 kB 🟢 -1.25 kB
assets/saveMesh-Cpv2GWWb.js (new) 3.8 kB 🔴 +3.8 kB 🔴 +1.64 kB 🔴 +1.44 kB
assets/saveMesh-DDmEOU_H.js (removed) 3.8 kB 🟢 -3.8 kB 🟢 -1.64 kB 🟢 -1.44 kB
assets/Media3DTop-Cy0lLjUx.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.57 kB 🟢 -1.38 kB
assets/Media3DTop-Wn1FOFYv.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.57 kB 🔴 +1.39 kB
assets/GlobalToast-_Zuztt1w.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/GlobalToast-BrQCPevI.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.26 kB 🔴 +1.08 kB
assets/SubscribeToRun-BZ3ENa6f.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +980 B 🔴 +873 B
assets/SubscribeToRun-DuO5YS67.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -980 B 🟢 -872 B
assets/CloudRunButtonWrapper-B9diUNzr.js (removed) 1.88 kB 🟢 -1.88 kB 🟢 -860 B 🟢 -790 B
assets/CloudRunButtonWrapper-DpDYvo-s.js (new) 1.88 kB 🔴 +1.88 kB 🔴 +859 B 🔴 +759 B
assets/cloudBadges-DdLta-A_.js (removed) 1.65 kB 🟢 -1.65 kB 🟢 -840 B 🟢 -736 B
assets/cloudBadges-DsIYcSQG.js (new) 1.65 kB 🔴 +1.65 kB 🔴 +840 B 🔴 +737 B
assets/cloudSubscription-C1Iv0elG.js (removed) 1.56 kB 🟢 -1.56 kB 🟢 -764 B 🟢 -651 B
assets/cloudSubscription-Ci-Ev083.js (new) 1.56 kB 🔴 +1.56 kB 🔴 +762 B 🔴 +652 B
assets/previousFullPath-5MCtNfBc.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +695 B 🔴 +600 B
assets/previousFullPath-B1KKo1It.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -694 B 🟢 -600 B
assets/Load3D-CCP8nzjI.js (removed) 1.23 kB 🟢 -1.23 kB 🟢 -562 B 🟢 -499 B
assets/Load3D-xlxmp_Sm.js (new) 1.23 kB 🔴 +1.23 kB 🔴 +563 B 🔴 +498 B
assets/nightlyBadges-C8RSaV7H.js (new) 1.18 kB 🔴 +1.18 kB 🔴 +606 B 🔴 +538 B
assets/nightlyBadges-CA1VLvjW.js (removed) 1.18 kB 🟢 -1.18 kB 🟢 -608 B 🟢 -538 B
assets/Load3dViewerContent-C31svghN.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -516 B 🟢 -454 B
assets/Load3dViewerContent-CFhMY8km.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +517 B 🔴 +451 B
assets/SubscriptionPanelContentWorkspace-DLZZWEQQ.js (new) 1.04 kB 🔴 +1.04 kB 🔴 +485 B 🔴 +421 B
assets/SubscriptionPanelContentWorkspace-DttBKUCT.js (removed) 1.04 kB 🟢 -1.04 kB 🟢 -487 B 🟢 -423 B
assets/WidgetLegacy-BZ5v9ueh.js (new) 864 B 🔴 +864 B 🔴 +433 B 🔴 +375 B
assets/WidgetLegacy-D4ZmWZwh.js (removed) 864 B 🟢 -864 B 🟢 -433 B 🟢 -380 B
assets/changeTracker-CgsQteVl.js (removed) 839 B 🟢 -839 B 🟢 -423 B 🟢 -373 B
assets/changeTracker-CNLHEOXl.js (new) 839 B 🔴 +839 B 🔴 +422 B 🔴 +368 B
assets/graphHasMissingNodes-BF-yThHr.js (removed) 822 B 🟢 -822 B 🟢 -412 B 🟢 -347 B
assets/graphHasMissingNodes-tbQI_lyM.js (new) 822 B 🔴 +822 B 🔴 +413 B 🔴 +348 B

Status: 53 added / 53 removed / 79 unchanged

⚡ Performance Report

ℹ️ Collecting baseline variance data (0/5 runs). Significance will appear after 2 main branch runs.

Metric Baseline PR Δ
canvas-idle: style recalcs 10 12 +17%
canvas-idle: layouts 0 0 +0%
canvas-idle: task duration 473ms 362ms -24%
canvas-idle: DOM nodes 20 23 +19%
canvas-idle: script duration 30ms 20ms -32%
canvas-idle: event listeners 5 14 +163%
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: frame duration 17ms 17ms +0%
canvas-mouse-sweep: style recalcs 79 77 -3%
canvas-mouse-sweep: layouts 12 12 +0%
canvas-mouse-sweep: task duration 878ms 765ms -13%
canvas-mouse-sweep: DOM nodes 63 60 -5%
canvas-mouse-sweep: script duration 142ms 123ms -14%
canvas-mouse-sweep: event listeners 6 4 -33%
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: frame duration 17ms 17ms +0%
canvas-zoom-sweep: style recalcs 31 32 +2%
canvas-zoom-sweep: layouts 6 6 +0%
canvas-zoom-sweep: task duration 377ms 310ms -18%
canvas-zoom-sweep: DOM nodes 79 81 +3%
canvas-zoom-sweep: script duration 34ms 24ms -30%
canvas-zoom-sweep: event listeners 19 35 +84%
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: frame duration 17ms 17ms +0%
dom-widget-clipping: style recalcs 14 13 -2%
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 397ms 348ms -12%
dom-widget-clipping: DOM nodes 23 23 -3%
dom-widget-clipping: script duration 74ms 59ms -20%
dom-widget-clipping: event listeners 10 10 +0%
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: frame duration 17ms 17ms +0%
large-graph-idle: style recalcs 11 11 +0%
large-graph-idle: layouts 0 0 +0%
large-graph-idle: task duration 619ms 490ms -21%
large-graph-idle: DOM nodes 23 23 -1%
large-graph-idle: script duration 117ms 89ms -24%
large-graph-idle: event listeners 21 14 -32%
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: frame duration 17ms 17ms +0%
large-graph-pan: style recalcs 69 71 +3%
large-graph-pan: layouts 0 0 +0%
large-graph-pan: task duration 1149ms 1048ms -9%
large-graph-pan: DOM nodes 17 21 +23%
large-graph-pan: script duration 424ms 399ms -6%
large-graph-pan: event listeners 4 6 +50%
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: frame duration 17ms 17ms +0%
minimap-idle: style recalcs 9 11 +19%
minimap-idle: layouts 0 0 +0%
minimap-idle: task duration 627ms 481ms -23%
minimap-idle: DOM nodes 18 21 +19%
minimap-idle: script duration 111ms 88ms -20%
minimap-idle: event listeners 4 6 +50%
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: frame duration 17ms 17ms -0%
subgraph-dom-widget-clipping: style recalcs 49 48 -1%
subgraph-dom-widget-clipping: layouts 0 0 +0%
subgraph-dom-widget-clipping: task duration 405ms 346ms -15%
subgraph-dom-widget-clipping: DOM nodes 25 22 -11%
subgraph-dom-widget-clipping: script duration 132ms 117ms -11%
subgraph-dom-widget-clipping: event listeners 24 8 -67%
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: frame duration 17ms 17ms -0%
subgraph-idle: style recalcs 11 11 +3%
subgraph-idle: layouts 0 0 +0%
subgraph-idle: task duration 443ms 360ms -19%
subgraph-idle: DOM nodes 22 22 -1%
subgraph-idle: script duration 27ms 19ms -29%
subgraph-idle: event listeners 13 21 +60%
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: frame duration 17ms 17ms -0%
subgraph-mouse-sweep: style recalcs 77 79 +3%
subgraph-mouse-sweep: layouts 16 16 +0%
subgraph-mouse-sweep: task duration 735ms 672ms -9%
subgraph-mouse-sweep: DOM nodes 64 67 +5%
subgraph-mouse-sweep: script duration 109ms 92ms -16%
subgraph-mouse-sweep: event listeners 5 12 +157%
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: frame duration 17ms 17ms +0%
vue-large-graph-idle: style recalcs 0 0 +0%
vue-large-graph-idle: layouts 0 0 +0%
vue-large-graph-idle: task duration 13010ms 11352ms -13%
vue-large-graph-idle: DOM nodes -5004 -3334 -33%
vue-large-graph-idle: script duration 654ms 596ms -9%
vue-large-graph-idle: event listeners -16481 -16487 +0%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: frame duration 18ms 18ms +0%
vue-large-graph-pan: style recalcs 71 65 -9%
vue-large-graph-pan: layouts 0 0 +0%
vue-large-graph-pan: task duration 14912ms 13262ms -11%
vue-large-graph-pan: DOM nodes -3339 -3522 +5%
vue-large-graph-pan: script duration 920ms 863ms -6%
vue-large-graph-pan: event listeners -16483 -16488 +0%
vue-large-graph-pan: TBT 26ms 19ms -28%
vue-large-graph-pan: frame duration 19ms 18ms -3%
workflow-execution: style recalcs 18 20 +7%
workflow-execution: layouts 5 5 +7%
workflow-execution: task duration 133ms 128ms -4%
workflow-execution: DOM nodes 159 167 +5%
workflow-execution: script duration 32ms 28ms -13%
workflow-execution: event listeners 55 55 +0%
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: frame duration 17ms 17ms -0%
Raw data
{
  "timestamp": "2026-03-17T13:25:21.368Z",
  "gitSha": "92a6eef3d8f4a8299bbfaaee79134ef1368776ab",
  "branch": "feat/perf-trend-visualization",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2004.9300000000017,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.232000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 360.44100000000003,
      "heapDeltaBytes": 1604708,
      "domNodes": 22,
      "jsHeapTotalBytes": 21233664,
      "scriptDurationMs": 19.885,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "canvas-idle",
      "durationMs": 2012.7229999999372,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 10.630000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 371.086,
      "heapDeltaBytes": -602828,
      "domNodes": 25,
      "jsHeapTotalBytes": 16134144,
      "scriptDurationMs": 20.443,
      "eventListeners": 30,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "canvas-idle",
      "durationMs": 2007.141000000047,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 9.812999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 353.735,
      "heapDeltaBytes": -5211940,
      "domNodes": 23,
      "jsHeapTotalBytes": 24903680,
      "scriptDurationMs": 20.769999999999996,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1827.477999999985,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 38.190000000000005,
      "layouts": 12,
      "layoutDurationMs": 3.708,
      "taskDurationMs": 770.076,
      "heapDeltaBytes": -2116060,
      "domNodes": 59,
      "jsHeapTotalBytes": 17563648,
      "scriptDurationMs": 120.01900000000002,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1861.3249999999653,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 37.358000000000004,
      "layouts": 12,
      "layoutDurationMs": 3.6689999999999996,
      "taskDurationMs": 746.214,
      "heapDeltaBytes": -2287800,
      "domNodes": 60,
      "jsHeapTotalBytes": 15990784,
      "scriptDurationMs": 123.03999999999998,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1840.8850000000712,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 43.38,
      "layouts": 12,
      "layoutDurationMs": 4.154,
      "taskDurationMs": 778.7420000000001,
      "heapDeltaBytes": -2505748,
      "domNodes": 61,
      "jsHeapTotalBytes": 17563648,
      "scriptDurationMs": 126.42799999999998,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1746.1289999999963,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 16.408,
      "layouts": 6,
      "layoutDurationMs": 0.6020000000000001,
      "taskDurationMs": 310.14300000000003,
      "heapDeltaBytes": 6165816,
      "domNodes": 77,
      "jsHeapTotalBytes": 16777216,
      "scriptDurationMs": 23.379,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1755.2820000000793,
      "styleRecalcs": 33,
      "styleRecalcDurationMs": 20.133000000000003,
      "layouts": 6,
      "layoutDurationMs": 0.551,
      "taskDurationMs": 320.247,
      "heapDeltaBytes": 6735640,
      "domNodes": 83,
      "jsHeapTotalBytes": 15204352,
      "scriptDurationMs": 24.180000000000003,
      "eventListeners": 43,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1712.1250000000146,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 17.034,
      "layouts": 6,
      "layoutDurationMs": 0.5279999999999998,
      "taskDurationMs": 298.35499999999996,
      "heapDeltaBytes": -486264,
      "domNodes": 83,
      "jsHeapTotalBytes": 24641536,
      "scriptDurationMs": 24.371999999999996,
      "eventListeners": 43,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 599.7710000000325,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 8.617,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 363.72700000000003,
      "heapDeltaBytes": 13712288,
      "domNodes": 22,
      "jsHeapTotalBytes": 13631488,
      "scriptDurationMs": 57.946,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 542.3710000000028,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 8.964,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 338.194,
      "heapDeltaBytes": 11871608,
      "domNodes": 21,
      "jsHeapTotalBytes": 15728640,
      "scriptDurationMs": 57.948,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 545.2259999999569,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 10.241,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 341.716,
      "heapDeltaBytes": 13164664,
      "domNodes": 25,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 61.254999999999995,
      "eventListeners": 26,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "large-graph-idle",
      "durationMs": 1991.0380000000032,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.306999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 485.344,
      "heapDeltaBytes": -9817912,
      "domNodes": 22,
      "jsHeapTotalBytes": 7196672,
      "scriptDurationMs": 87.256,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2021.176999999966,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 9.047999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 493.81800000000004,
      "heapDeltaBytes": -9870604,
      "domNodes": 25,
      "jsHeapTotalBytes": 7196672,
      "scriptDurationMs": 89.92100000000002,
      "eventListeners": 30,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2032.5060000000121,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.519,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 489.96799999999996,
      "heapDeltaBytes": -10597856,
      "domNodes": 22,
      "jsHeapTotalBytes": 6959104,
      "scriptDurationMs": 89.447,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2121.0629999999924,
      "styleRecalcs": 71,
      "styleRecalcDurationMs": 17.669,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1114.0810000000001,
      "heapDeltaBytes": 7854160,
      "domNodes": 22,
      "jsHeapTotalBytes": 11333632,
      "scriptDurationMs": 446.782,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2085.935999999947,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 16.262,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1014.756,
      "heapDeltaBytes": 1500148,
      "domNodes": 20,
      "jsHeapTotalBytes": 9236480,
      "scriptDurationMs": 370.051,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2097.593999999958,
      "styleRecalcs": 71,
      "styleRecalcDurationMs": 18.321000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1016.1980000000002,
      "heapDeltaBytes": 5623984,
      "domNodes": 22,
      "jsHeapTotalBytes": 7925760,
      "scriptDurationMs": 380.853,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "minimap-idle",
      "durationMs": 1990.694000000019,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.352000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 475.86400000000003,
      "heapDeltaBytes": -10472708,
      "domNodes": 20,
      "jsHeapTotalBytes": 8245248,
      "scriptDurationMs": 85.736,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "minimap-idle",
      "durationMs": 2003.7880000000996,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.545,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 488.86800000000005,
      "heapDeltaBytes": -10392120,
      "domNodes": 20,
      "jsHeapTotalBytes": 9056256,
      "scriptDurationMs": 90.729,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "minimap-idle",
      "durationMs": 1992.3639999999523,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 8.738,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 478.875,
      "heapDeltaBytes": -10506720,
      "domNodes": 24,
      "jsHeapTotalBytes": 6934528,
      "scriptDurationMs": 87.262,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 538.4980000000041,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 11.155999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 348.12299999999993,
      "heapDeltaBytes": 11820676,
      "domNodes": 22,
      "jsHeapTotalBytes": 15990784,
      "scriptDurationMs": 117.56,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 546.0130000000163,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 10.690999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 352.15999999999997,
      "heapDeltaBytes": 11754484,
      "domNodes": 22,
      "jsHeapTotalBytes": 15728640,
      "scriptDurationMs": 119.468,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 510.87599999993927,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 10.007,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 336.785,
      "heapDeltaBytes": 12980164,
      "domNodes": 22,
      "jsHeapTotalBytes": 15204352,
      "scriptDurationMs": 114.329,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1995.4649999999674,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.655999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 352.83400000000006,
      "heapDeltaBytes": 2116308,
      "domNodes": 22,
      "jsHeapTotalBytes": 17301504,
      "scriptDurationMs": 16.549,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.680000000000017
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1992.256999999995,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 11.405999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 369.307,
      "heapDeltaBytes": 1693528,
      "domNodes": 26,
      "jsHeapTotalBytes": 17301504,
      "scriptDurationMs": 21.121000000000002,
      "eventListeners": 30,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1999.1360000000213,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.016,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 357.82599999999996,
      "heapDeltaBytes": 1764272,
      "domNodes": 18,
      "jsHeapTotalBytes": 17825792,
      "scriptDurationMs": 19.009999999999998,
      "eventListeners": 28,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1725.5150000000299,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 41.68,
      "layouts": 16,
      "layoutDurationMs": 4.368,
      "taskDurationMs": 656.0989999999999,
      "heapDeltaBytes": -6933288,
      "domNodes": 68,
      "jsHeapTotalBytes": 17039360,
      "scriptDurationMs": 89.339,
      "eventListeners": 28,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1731.029000000035,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 40.738,
      "layouts": 16,
      "layoutDurationMs": 4.843,
      "taskDurationMs": 687.6049999999999,
      "heapDeltaBytes": -7182828,
      "domNodes": 65,
      "jsHeapTotalBytes": 16777216,
      "scriptDurationMs": 96.232,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1738.5189999999966,
      "styleRecalcs": 80,
      "styleRecalcDurationMs": 39.977,
      "layouts": 16,
      "layoutDurationMs": 4.593,
      "taskDurationMs": 672.698,
      "heapDeltaBytes": -6438816,
      "domNodes": 67,
      "jsHeapTotalBytes": 17301504,
      "scriptDurationMs": 89.892,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.67999999999997
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11161.60400000001,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11152.243,
      "heapDeltaBytes": -24838380,
      "domNodes": -3333,
      "jsHeapTotalBytes": 24117248,
      "scriptDurationMs": 566.4350000000001,
      "eventListeners": -16488,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.33000000000029
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11610.646000000088,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11592.517999999998,
      "heapDeltaBytes": -31060456,
      "domNodes": -3339,
      "jsHeapTotalBytes": 22544384,
      "scriptDurationMs": 616.409,
      "eventListeners": -16486,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.340000000000146
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11321.045000000027,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11309.800000000001,
      "heapDeltaBytes": -26591968,
      "domNodes": -3331,
      "jsHeapTotalBytes": 21757952,
      "scriptDurationMs": 605.8939999999999,
      "eventListeners": -16486,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.339999999999783
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 13200.69000000001,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 13.191000000000008,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13182.626999999999,
      "heapDeltaBytes": -10898172,
      "domNodes": -3338,
      "jsHeapTotalBytes": 17477632,
      "scriptDurationMs": 844.973,
      "eventListeners": -16484,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.329999999999927
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 13469.667999999956,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 13.689000000000007,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13449.192000000001,
      "heapDeltaBytes": -42209352,
      "domNodes": -3889,
      "jsHeapTotalBytes": 19312640,
      "scriptDurationMs": 884.654,
      "eventListeners": -16496,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.329999999999927
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 13173.531000000025,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 13.324000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13155.437000000002,
      "heapDeltaBytes": -17376260,
      "domNodes": -3338,
      "jsHeapTotalBytes": 23244800,
      "scriptDurationMs": 858.4040000000001,
      "eventListeners": -16484,
      "totalBlockingTimeMs": 57,
      "frameDurationMs": 18.339999999999783
    },
    {
      "name": "workflow-execution",
      "durationMs": 444.5460000000594,
      "styleRecalcs": 17,
      "styleRecalcDurationMs": 23.586,
      "layouts": 5,
      "layoutDurationMs": 1.6059999999999999,
      "taskDurationMs": 137.89800000000002,
      "heapDeltaBytes": -14319304,
      "domNodes": 164,
      "jsHeapTotalBytes": 7864320,
      "scriptDurationMs": 31.247000000000003,
      "eventListeners": 55,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "workflow-execution",
      "durationMs": 464.5910000000413,
      "styleRecalcs": 23,
      "styleRecalcDurationMs": 25.586,
      "layouts": 6,
      "layoutDurationMs": 1.601,
      "taskDurationMs": 131.863,
      "heapDeltaBytes": 4500648,
      "domNodes": 179,
      "jsHeapTotalBytes": 4194304,
      "scriptDurationMs": 29.375000000000004,
      "eventListeners": 55,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "workflow-execution",
      "durationMs": 439.3129999999701,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 22.788000000000004,
      "layouts": 5,
      "layoutDurationMs": 1.2529999999999997,
      "taskDurationMs": 114.072,
      "heapDeltaBytes": 4328192,
      "domNodes": 157,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 23.756000000000007,
      "eventListeners": 55,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    }
  ]
}

@christian-byrne christian-byrne merged commit 2af3940 into main Mar 17, 2026
41 of 42 checks passed
@christian-byrne christian-byrne deleted the feat/perf-trend-visualization branch March 17, 2026 14:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants